#ifndef LECTEURPROGRAMME_H
#define	LECTEURPROGRAMME_H

#include <string>
#include <vector>
#include <stdlib.h>

#include "LecteurFonction.h"

using namespace std;

class LecteurProgramme : public Lecteur {
    
public:
    LecteurProgramme(string nomFich);
    // Construit un lecteur de programme pour vérifier et exécuter le programme nomFich
    
    
private:
    vector<LecteurFonction*> tf; // la table des fonctions déclarées dans le programme
    
    // implémentation de la grammaire
    Noeud* programme();           //  <programme>    ::= <seqDecl> debut <seqInst> fin
    void seqDecl();               //  <seqDecl>      ::= <declFonction> ; { <declFonction> ; }
    Noeud* seqInst();             //  <seqInst>      ::= <inst> ; { <inst> ; }
    Noeud* inst();                //  <inst>         ::= <affectation> | <instSi> | <instTq> | <instRepeter> | <instLire> | <instEcrire>
    Noeud* appelFonction();       //  <appelFonction>::= <variable> ( <expression> { , <expression> } )
    Noeud* affectation();         //  <affectation>  ::= <variable> = <expression>
    Noeud* facteur();             //  <facteur>      ::= <ENTIER> | <REEL> | <CARACTERE> | <CHAINE> | <appelFonction> | <variable> | <opUnaire> <expBool> | ( <expBool> )
    Noeud* instSi();              //  <instSi>       ::= si ( <expBool> ) <seqInst> { sinonsi ( <expBool> ) <seqInst> } [ sinon <seqInst> ] finsi
    Noeud* instChoix();           //  <instChoix> ::= choix ( <expression> ) { cas <expression> : <seqInst> stop } defaut : <seqInst> stop finchoix
    Noeud* instTq();              //  <instTq>       ::= tantque ( <expBool> ) <seqInst> fintq
    Noeud* instRepeter();         //  <instRepeter>  ::= repeter <seqInst> jusqua ( <expBool> )
    Noeud* instPour();            //  <instPour>     ::= pour ( <affectation> ; <expBool> ; <affectation> ) <seqInst> finpour
    Noeud* instLire();            //  <instLire>     ::= lire ( <variable> )
    Noeud* instEcrire();          //  <instEcrire>   ::= ecrire ( <expression> )
};






#endif	/* LECTEURPROGRAMME_H */

